package com.sh.recursion;

/**
 * @ClassName MiGong
 * @Description TODO
 * @Author yaoqiang
 * @Date 2020/11/7 10:08
 * @Version 1.0
 */
public class MiGong {
    public static void main(String[] args) {
        //先创建一个二维数组模拟迷宫
        //地图
        int[][] map =new int[8][7];
        //使用1表示墙，
        //先把上下置为1
        for(int i=0;i<7;i++){
            map[0][i]=1;
            map[7][i]=1;

        }
        for (int i=0;i<8;i++){
            map[i][0]=1;
            map[i][6]=1;
        }
        map[3][1]=1;
        map[3][2]=1;
//输出地图
        System.out.println("地图");
        for (int i=0;i<8;i++){
            for (int j=0;j<7;j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }
        setWay(map,1,1);
        //输出地图
        System.out.println("走的路径地图");
        for (int i=0;i<8;i++){
            for (int j=0;j<7;j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }
    }
    //使用递归回溯找路

    /**
     * 使用递归回溯找路
     * 说明
     *  1、map表示地图
     *  2、ij表示出发位置，
     *  3、小球能到map[6][5]，说明录找到
     *  4、1未墙，0为未走过，2表示可以走；3表示已经走过但是走不通
     *  走迷宫的时候的策略 下右上左，如果该点走不通，再回溯
     *
     * @param map 地图
     * @param i 从哪个位置找
     * @param j
     * @return 如果找到通路就返回true
     */
    public static boolean setWay(int[][] map,int i,int j){
        if(map[6][5]==2){
            return  true;
        }else {
            if (map[i][j]==0){
                //表示这个点没有走过，按照策略下右上左
                map[i][j]=2;
                if (setWay(map,i+1,j)){//下
                    return true;
                }if (setWay(map,i,j+1)){//右
                    return true;
                }if (setWay(map,i-1,j)){//上
                    return true;
                }if (setWay(map,i,j-1)){//左
                    return true;
                }else {
                    map[i][j]=3;
                    return false;
                }
            }else{//1墙2走过3走不通
                return false;
            }
        }
    }
}
